package controllers

import (
	"errmsg"
	"errors"
	"github.com/astaxie/beego/logs"
	"github.com/astaxie/beego/validation"
	"regexp"
	"smart_home/api/models"
)

type TripController struct {
	BaseController
}

// @Title 添加行程
// @param what	true	string	做什么
// @param time	true	string	提醒时间 10:56
// @param wkocc	true	string	循环周期 例子：0000000
// @param date	false	string	指定提醒日期 2018-06-25 当指定日期的时候 wkocc 必须为0000000
// @param to	true	string	提醒对象
// 的用户id, 如果是提醒自己，则留空
// @router / [post]
func (c *TripController) Post() {
	var (
		tp  *models.Trip
		err error
	)

	tp = &models.Trip{UserId: c.User.Id, Status: 1}
	if err = c.ParseData(tp); err != nil {
		logs.Error("TripController error:", err)
		c.Error(errmsg.ErrResponseParameter)
		return
	}

	if len(tp.To) == 0 {
		tp.To = tp.UserId
	}

	if len(tp.Source) == 0 {
		tp.Source = "app"
	}

	logs.Debug("data:", c.Input())

	// 验证数据
	err = c.validate(tp)
	if err != nil {
		c.Error(err)
		return
	}

	if err = models.AddTrip(tp); err != nil {
		c.Error(err)
		return
	}

	c.Success(nil)
}

// @Title 修改行程
// @param id	true	string
// @param what	true	string	做什么
// @param time	true	string	提醒时间 10:56
// @param wkocc	true	string	循环周期 例子：0000000
// @param date	false	string	指定提醒日期 2018-06-25 当指定日期的时候 wkocc 必须为0000000
// @param to	true	string	提醒对象
// @router /:id [put]
func (c *TripController) Put() {
	var (
		id  string
		err error
		tp  *models.Trip
	)

	id = c.GetString(":id")
	if tp, err = models.GetTripById(id); err != nil {
		c.Error(err)
		return
	}

	logs.Debug("trip:", tp)
	logs.Debug("body", string(c.Ctx.Input.RequestBody))

	if tp.UserId != c.User.Id {
		c.Error(errmsg.ErrResponseAuth)
		return
	}

	if err = c.ParseData(tp); err != nil {
		logs.Error("TripController error:", err)
		c.Error(errmsg.ErrResponseParameter)
		return
	}

	if len(tp.To) == 0 {
		tp.To = tp.UserId
	}

	if len(tp.Source) == 0 {
		tp.Source = "app"
	}

	// 验证数据
	err = c.validate(tp)
	if err != nil {
		c.Error(err)
		return
	}

	if err = models.UpdateTrip(tp); err != nil {
		c.Error(err)
		return
	}

	c.Success(nil)
}

func (c *TripController) validate(tp *models.Trip) error {
	vali := validation.Validation{}
	vali.Required(tp.What, "what").Message("行程内容不能为空")
	vali.Required(tp.Time, "time").Message("提醒时间不能为空")

	reg := regexp.MustCompile(`([0-1][0-9]|2[0-3]):([0-5][0-9])`)
	vali.Match(tp.Time, reg, "time").Message("时间格式有误")
	vali.Required(tp.Wkocc, "wkocc").Message("wkocc不能为空")
	reg = regexp.MustCompile(`[01]{7}`)
	vali.Match(tp.Wkocc, reg, "wkocc").Message("wkocc的值有7位0个1的数字组成")
	reg = regexp.MustCompile(`[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$`)
	if len(tp.Date) > 0 {
		vali.Match(tp.Date, reg, "date").Message("日期格式不正确，正确格式为：2014-01-01")
	}
	if vali.HasErrors() {
		return vali.Errors[0]
	}

	if tp.Wkocc != "0000000" && len(tp.Date) > 0 {
		return errors.New("指定date的时候，wkocc必须为0000000")
	}

	// 如果不是提醒自己，则判断提醒对象是否家人
	if tp.To != tp.UserId {
		is, err := models.IsMyFamily(tp.To, tp.UserId)
		if err != nil {
			return err
		}
		if !is {
			return errors.New("家人的不存在，或未注册哦~")
		}
	}

	return nil
}

// @Title 删除行程
// @param id	true	string
// @router /:id [delete]
func (c *TripController) Delete() {
	var (
		id  string
		err error
	)
	id = c.GetString(":id")
	if err = models.DelTrip(c.User.Id, id); err != nil {
		c.Error(err)
		return
	}
	c.Success(nil)
}

// @Title 获取行程详情
// @param id	true	string
// @router /:id [get]
func (c *TripController) Get() {
	var (
		id  string
		tp  *models.Trip
		err error
	)
	id = c.GetString(":id")
	if tp, err = models.GetTripById(id); err != nil {
		c.Error(err)
		return
	}
	if tp == nil {
		c.Error(errmsg.ErrResponseNotFound)
		return
	}
	if tp.UserId != c.User.Id {
		c.Error(errmsg.ErrResponseAuth)
		return
	}
	c.Success(tp)
}

// @Title 行程列表
// @param page int true
// @param row int true
// @router / [get]
func (c *TripController) GetAll() {
	var (
		ls   []*models.Trip
		err  error
		page int
	)

	if page, err = c.GetInt("page", 1); err != nil {
		logs.Error(errmsg.ErrResponseParameter)
		c.Error(errmsg.ErrResponseParameter)
		return
	}

	if ls, err = models.GetAllTripByUid(c.User.Id, page); err != nil {
		c.Error(err)
		return
	}
	c.Success(ls)
}

// @Title 行程开关
// @router /status/:id [post]
func (c *TripController) Status() {
	var (
		id     string
		status int
		err    error
		tp     *models.Trip
	)

	c.Ctx.Input.Bind(&id, ":id")
	if status, err = c.GetInt("status", 0); err != nil || (status != 0 && status != 1) {
		c.Error(errmsg.ErrResponseParameter)
		return
	}

	if tp, err = models.GetTripById(id); err != nil {
		c.Error(err)
		return
	}
	if tp == nil {
		c.Error(errmsg.ErrResponseNotFound)
		return
	}
	if tp.UserId != c.User.Id {
		c.Error(errmsg.ErrResponseAuth)
		return
	}

	tp.Status = status
	if err = models.UpdateTrip(tp); err != nil {
		c.Error(err)
		return
	}

	c.Success(nil)
}
